﻿using Microsoft.Extensions.Logging;
using Newtonsoft.Json.Linq;
using ST.Common.Util;
using ST.WX.Common;
using ST.WX.XCX.QRCode.Model;
using System;
using System.Drawing;

namespace ST.WX.XCX.QRCode
{
	/// <summary>
	/// 小程序码/小程序二维码
	/// </summary>
	public class WXQRCodeApi
	{
		private readonly ILogger logger;
		private readonly WXBaseApi baseApi;

		public WXQRCodeApi(ILogger<WXQRCodeApi> _logger, WXBaseApi _baseApi)
		{
			logger = _logger;
			baseApi = _baseApi;
		}

		/// <summary>
		/// 获取小程序（二维码），适用于需要的码数量较少的业务场景。通过该接口生成的小程序码，永久有效，有数量限制
		/// </summary>
		/// <param name="appID"></param>
		/// <param name="path">扫码进入的小程序页面路径，最大长度 128 字节，不能为空；对于小游戏，可以只传入 query 部分，来实现传参效果，如：传入 "?foo=bar"，即可在 wx.getLaunchOptionsSync 接口中的 query 参数获取到 {foo:"bar"}。</param>
		/// <param name="width">二维码的宽度，单位 px。最小 280px，最大 1280px</param>
		/// <returns></returns>
		public WXQRCodeResult CreateQRCode(string appID, string appSecret, string path, int width)
		{
			try
			{
				width = width >= 280 && width <= 1280 ? width : 430;
				if (logger.IsEnabled(LogLevel.Debug))
				{
					logger.LogDebug("参数->appID:{0},path:{1},width:{2}",
						appID, path, width);
				}

				var paras = new JObject {
					{ "path", path },
					{ "width", width },
				};

				var resp = HttpHelper.PostStream("https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=" + baseApi.GetAccessToken(appID, appSecret), paras);
				if (resp == null)
				{
					throw new WXException("获取小程序二维码失败，返回内容为空");
				}
				if (!string.IsNullOrEmpty(resp.content))
				{
					var ret = Newtonsoft.Json.JsonConvert.DeserializeObject<WXQRCodeResult>(resp.content);
					throw new WXException(ret.errmsg);
				}
				else if (resp.buffer != null && resp.buffer.Length > 0)
				{
					WXQRCodeResult ret = new WXQRCodeResult();
					ret.buffer = resp.buffer;
					ret.contentType = resp.contentType;
					return ret;
				}
				else
				{
					throw new WXException("获取小程序二维码失败，返回结果类型有误");
				}
			}
			catch (WXException ex)
			{
				logger.LogError(ex, "获取小程序二维码出错");
				throw;
			}
			catch (Exception ex)
			{
				logger.LogError(ex, "获取小程序二维码出错");
				throw new WXException("获取小程序二维码失败，" + (ex.InnerException != null ? ex.InnerException.Message : ex.Message));
			}
		}

		/// <summary>
		/// 获取小程序码，适用于需要的码数量较少的业务场景。通过该接口生成的小程序码，永久有效，有数量限制
		/// </summary>
		/// <param name="paras"></param>
		/// <returns></returns>
		private WXQRCodeResult GetWXACode(string appID, string appSecret, JObject paras)
		{
			try
			{
				var resp = HttpHelper.PostStream("https://api.weixin.qq.com/wxa/getwxacode?access_token=" + baseApi.GetAccessToken(appID, appSecret), paras);
				if (resp == null)
				{
					throw new WXException("获取小程序码失败，返回内容为空");
				}
				if (!string.IsNullOrEmpty(resp.content))
				{
					var ret = Newtonsoft.Json.JsonConvert.DeserializeObject<WXQRCodeResult>(resp.content);
					throw new WXException(ret.errmsg);
				}
				else if (resp.buffer != null && resp.buffer.Length > 0)
				{
					WXQRCodeResult ret = new WXQRCodeResult();
					ret.buffer = resp.buffer;
					ret.contentType = resp.contentType;
					return ret;
				}
				else
				{
					throw new WXException("获取小程序码失败，返回结果类型有误");
				}
			}
			catch (WXException ex)
			{
				logger.LogError(ex, "获取小程序二维码出错");
				throw;
			}
			catch (Exception ex)
			{
				logger.LogError(ex, "获取小程序二维码出错");
				throw new WXException("获取小程序二维码失败，" + (ex.InnerException != null ? ex.InnerException.Message : ex.Message));
			}
		}

		/// <summary>
		/// 获取小程序码，适用于需要的码数量较少的业务场景。通过该接口生成的小程序码，永久有效，有数量限制
		/// </summary>
		/// <param name="appID"></param>
		/// <param name="path">扫码进入的小程序页面路径，最大长度 128 字节，不能为空；对于小游戏，可以只传入 query 部分，来实现传参效果，如：传入 "?foo=bar"，即可在 wx.getLaunchOptionsSync 接口中的 query 参数获取到 {foo:"bar"}。</param>
		/// <param name="autoColor">默认：false，自动配置线条颜色，如果颜色依然是黑色，则说明不建议配置主色调</param>
		/// <param name="lineColor">默认：false，auto_color 为 false 时生效，使用 rgb 设置颜色 例如 {"r":"xxx","g":"xxx","b":"xxx"} 十进制表示</param>
		/// <param name="isHyaline">默认：false，是否需要透明底色，为 true 时，生成透明底色的小程序码</param>
		/// <param name="width">默认：430，二维码的宽度，单位 px。最小 280px，最大 1280px</param>
		/// <returns></returns>
		public WXQRCodeResult GetWXACode(string appID, string appSecret, string path, int width, bool autoColor, Color lineColor, bool isHyaline)
		{
			width = width >= 280 && width <= 1280 ? width : 430;
			if (logger.IsEnabled(LogLevel.Debug))
			{
				logger.LogDebug("参数->appID:{0},path:{1},width:{2},auto_color:{3},line_color:{4},is_hyaline:{5}",
					appID, path, width, autoColor, lineColor, isHyaline);
			}

			var paras = new JObject {
					{ "path", path },
					{ "width", width },
					{ "auto_color",autoColor},
					{ "is_hyaline",isHyaline},
					{ "line_color",new JObject{ { "r", lineColor.R },{ "g", lineColor.G },{"b",lineColor.B} } }//{"r":0,"g":0,"b":0}
				};
			return GetWXACode(appID, appSecret, paras);
		}

		/// <summary>
		/// 获取小程序码，适用于需要的码数量较少的业务场景。通过该接口生成的小程序码，永久有效，有数量限制（非透明）
		/// </summary>
		/// <param name="appID"></param>
		/// <param name="path">扫码进入的小程序页面路径，最大长度 128 字节，不能为空；对于小游戏，可以只传入 query 部分，来实现传参效果，如：传入 "?foo=bar"，即可在 wx.getLaunchOptionsSync 接口中的 query 参数获取到 {foo:"bar"}。</param>
		/// <param name="width">默认：430，二维码的宽度，单位 px。最小 280px，最大 1280px</param>
		/// <returns></returns>
		public WXQRCodeResult GetWXACode(string appID, string appSecret, string path, int width = 430)
		{
			width = width >= 280 && width <= 1280 ? width : 430;
			if (logger.IsEnabled(LogLevel.Debug))
			{
				logger.LogDebug("参数->appID:{0},path:{1},width:{2}",
					appID, path, width);
			}

			var paras = new JObject {
					{ "path", path },
					{ "width", width },
				};
			return GetWXACode(appID, appSecret, paras);
		}

	}
}
